package hermes.persistencia;

import hermes.controle.ClasseNegocio;
import hermes.persistencia.mapeadores.ClasseMapeadora;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class OperacoesBanco {

    private ConexaoBancoDados con = null;

    public OperacoesBanco() {
        con = ConexaoBancoDados.obterConexaoComBancoDados();
    }

    public boolean inserirBancoDados(ClasseNegocio objeto, ClasseMapeadora classeMapeadora) {
        String sql = classeMapeadora.sqlInserir(objeto);
        con.abrirConexaoBancoDados();
        boolean resultadoOperacao = con.executarAtualizacao(sql);
        con.fecharConexaoBancoDados();
        return resultadoOperacao;
    }

    public ArrayList buscarBancoDados(ClasseMapeadora classeMapeadora, Integer idObjeto) {
        ArrayList<Object> arrayList = new ArrayList<Object>();

        String sql = classeMapeadora.sqlBuscar(idObjeto);
        con.abrirConexaoBancoDados();
        ResultSet rs = con.executarConsulta(sql);
        ResultSetMetaData rsmd = null;
        arrayList = this.extraiMetaDados(rs, rsmd);
        con.fecharConexaoBancoDados();
        return arrayList;
    }

    public ArrayList<Object> buscarBancoDados(ClasseMapeadora classeMapeadora, String campo, String argumento) {
        ArrayList arrayList = new ArrayList();
        String sql = classeMapeadora.sqlBuscar(classeMapeadora, campo, argumento);
        con.abrirConexaoBancoDados();
        ResultSet rs = con.executarConsulta(sql);
        ResultSetMetaData rsmd = null;
        arrayList = this.extraiMetaDados(rs, rsmd);
        con.fecharConexaoBancoDados();
        return arrayList;
    }

    public void alterarBancoDados(Integer idObjeto, ClasseNegocio objeto, ClasseMapeadora classeMapeadora) {
        String sql = classeMapeadora.sqlAlterar(objeto);
        con.abrirConexaoBancoDados();
        con.executarAtualizacao(sql);
        con.fecharConexaoBancoDados();
    }

    public ArrayList<Object> recuperarBancoDados(Integer idObjeto, ClasseMapeadora classeMapeadora) {
        ArrayList<Object> arrayList = new ArrayList<Object>();

        String sql = classeMapeadora.sqlBuscar(idObjeto);
        con.abrirConexaoBancoDados();
        ResultSet rs = con.executarConsulta(sql);
        ResultSetMetaData rsmd = null;
        arrayList = this.extraiMetaDados(rs, rsmd);
        con.fecharConexaoBancoDados();
        return arrayList;
    }

    public ArrayList<Object> recuperarListaBancoDados(ClasseMapeadora classeMapeadora) {
        ArrayList<Object> arrayList = new ArrayList<Object>();

        String sql = classeMapeadora.sqlListar();
        con.abrirConexaoBancoDados();
        ResultSet rs = con.executarConsulta(sql);
        ResultSetMetaData rsmd = null;
        arrayList = this.extraiMetaDados(rs, rsmd);
        con.fecharConexaoBancoDados();
        return arrayList;
    }

    public void excluirBancoDados(Integer idObjeto, ClasseMapeadora classeMapeadora) {
        String sql = classeMapeadora.sqlExcluir(idObjeto);
        con.abrirConexaoBancoDados();
        con.executarAtualizacao(sql);
        con.fecharConexaoBancoDados();
    }

    public Integer getUltimoID() throws SQLException {
        Integer i=0;
        ArrayList<Object> arrayList = new ArrayList<Object>();
        ResultSet rs = null;
        String sql = "insert into numerodesc (numero) value(0);";
        con.abrirConexaoBancoDados();
        i = con.getAutoIncremento(sql);
        ResultSetMetaData rsmd = null;
        return i;
    }

    public ArrayList<Object> extraiMetaDados(ResultSet lrs, ResultSetMetaData lrsmd) {
        ArrayList<Object> arrayList = new ArrayList<Object>();

        try {
            lrsmd = lrs.getMetaData();
            int qtdColunas = lrsmd.getColumnCount();
            while (lrs.next()) {
                for (int i = 1; i <= qtdColunas; i++) {
                    switch (lrsmd.getColumnType(i)) {
                        case Types.INTEGER:
                            arrayList.add(lrs.getInt(i));
                            break;
                        case Types.VARCHAR:
                            arrayList.add(lrs.getString(i));
                            break;

                        case Types.DATE:
                            arrayList.add(lrs.getDate(i));
                            break;

                        case Types.CHAR:
                            arrayList.add(lrs.getString(i));
                            break;

                        case Types.DOUBLE:
                            arrayList.add(lrs.getDouble(i));
                            break;

                        case Types.BOOLEAN:
                            arrayList.add(lrs.getBoolean(i));
                            break;

                        case Types.BIT:
                            arrayList.add(lrs.getBoolean(i));
                            break;

                    }



                }

            }
        } catch (SQLException ex) {
            Logger.getLogger(OperacoesBanco.class.getName()).log(Level.SEVERE, null, ex);
        }
        return arrayList;
    }
}
